﻿using LWH.ByteProtocol;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace ByteProtocolCSharpDemo
{
    /// <summary>
    /// 固定长度协议类
    /// 
    /// 注意在自定义属性时，如果某些属性依赖于其他属性，需要调用getData
    /// 则必需确保getData方法能正确返回数据，一般可以通过以下条件确保：
    /// 
    /// 1、在调用getData方法前确保协议类AbstractProtocol的byte数据有效，一般
    /// 情况下满足下面两个条件：
    /// a.不要在属性构造函数中直接或间接调用getData；
    /// b.AbstractProtocol已经传入一个有效的byte数组（通过AbstractProtocol的
    /// 构造函数或setData）即可
    /// 
    /// 2、如果不能满足上面的两点，则该属性的getData必需经过重写，或使用一个
    /// 缓存属性对其包装，使getData返回的是一个缓存byte数组，例如调用
    /// FixedDataProperty的getData
    /// </summary>
    public class SimpleProtocol : AbstractProtocol
    {
        //定义协议中的各种属性
        protected internal FixedDataProperty mHeaderProperty;

        protected internal ShortValueProperty mLengthProperty;

        protected internal FixLengthProperty mModeProperty;

        protected internal FixLengthProperty mSumProperty;

        protected internal FixedDataProperty mTailProperty;


        public SimpleProtocol(byte[] data = null) :base(data)
        {
            //初始化协议中的各种属性，并按顺序添加到协议中
            mHeaderProperty = new FixedDataProperty(this, new byte[] { (byte)0xF7 });
            mLengthProperty = new ShortValueProperty(new FixLengthProperty(this, 2));
            mModeProperty = new FixLengthProperty(this, 1);
            mSumProperty = new FixLengthProperty(this, 2);
            mTailProperty = new FixedDataProperty(this, new byte[] { (byte)0xF8 });

            addProperty(mHeaderProperty);
            addProperty(mLengthProperty);
            addProperty(mModeProperty);
            addProperty(mSumProperty);
            addProperty(mTailProperty);

        }

        #region Getter&Setter
        public IProperty getHeaderProperty()
        {
            return mHeaderProperty;
        }

        public ShortValueProperty getLengthProperty()
        {
            return mLengthProperty;
        }

        public IProperty getModeProperty()
        {
            return mModeProperty;
        }
        #endregion


    }
}
